home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / iffp / smus.h < prev    next >
C/C++ Source or Header  |  1992-05-18  |  8KB  |  184 lines

  1. /*----------------------------------------------------------------------*
  2.  * SMUS.H  Definitions for Simple MUSical score.   2/12/86
  3.  *
  4.  * By Jerry Morrison and Steve Hayes, Electronic Arts.
  5.  * This software is in the public domain.
  6.  *
  7.  * Modified for use with iffparse.library 05/91 - CAS_CBM
  8.  *
  9.  * This version for the Commodore-Amiga computer.
  10.  *----------------------------------------------------------------------*/
  11. #ifndef SMUS_H
  12. #define SMUS_H
  13.  
  14. #ifndef COMPILER_H
  15. #include "iffp/compiler.h"
  16. #endif
  17.  
  18. #include "iffp/iff.h"
  19.  
  20. #define ID_SMUS      MAKE_ID('S', 'M', 'U', 'S')
  21. #define ID_SHDR      MAKE_ID('S', 'H', 'D', 'R')
  22.  
  23. /* Now defined in iffp/iff.h as generic chunks
  24. #define ID_NAME      MAKE_ID('N', 'A', 'M', 'E')
  25. #define ID_Copyright MAKE_ID('(', 'c', ')', ' ')
  26. #define ID_AUTH      MAKE_ID('A', 'U', 'T', 'H')
  27. #define ID_ANNO      MAKE_ID('A', 'N', 'N', 'O')
  28. */
  29.  
  30. #define ID_INS1      MAKE_ID('I', 'N', 'S', '1')
  31. #define ID_TRAK      MAKE_ID('T', 'R', 'A', 'K')
  32.  
  33. /* ---------- SScoreHeader ---------------------------------------------*/
  34. typedef struct {
  35.     UWORD tempo;    /* tempo, 128ths quarter note/minute */
  36.     UBYTE volume;    /* playback volume 0 through 127 */
  37.     UBYTE ctTrack;    /* count of tracks in the score */
  38.     } SScoreHeader;
  39.  
  40. /* ---------- NAME -----------------------------------------------------*/
  41. /* NAME chunk contains a CHAR[], the musical score's name. */
  42.  
  43. /* ---------- Copyright (c) --------------------------------------------*/
  44. /* "(c) " chunk contains a CHAR[], the FORM's copyright notice. */
  45.  
  46. /* ---------- AUTH -----------------------------------------------------*/
  47. /* AUTH chunk contains a CHAR[], the name of the score's author. */
  48.  
  49. /* ---------- ANNO -----------------------------------------------------*/
  50. /* ANNO chunk contains a CHAR[], the author's text annotations. */
  51.  
  52. /* ---------- INS1 -----------------------------------------------------*/
  53. /* Constants for the RefInstrument's "type" field. */
  54. #define INS1_Name  0    /* just use the name; ignore data1, data2 */
  55. #define INS1_MIDI  1    /* <data1, data2> = MIDI <channel, preset> */
  56.  
  57. typedef struct {
  58.     UBYTE iRegister;    /* set this instrument register number */
  59.     UBYTE type;        /* instrument reference type (see above) */
  60.     UBYTE data1, data2;    /* depends on the "type" field */
  61.     char name[60];    /* instrument name */
  62.     } RefInstrument;
  63.  
  64. /* ---------- TRAK -----------------------------------------------------*/
  65. /* TRAK chunk contains an SEvent[]. */
  66.  
  67. /* SEvent: Simple musical event. */
  68. typedef struct {
  69.     UBYTE sID;        /* SEvent type code */
  70.     UBYTE data;        /* sID-dependent data */
  71.     } SEvent;
  72.  
  73. /* SEvent type codes "sID". */
  74. #define SID_FirstNote     0
  75. #define SID_LastNote    127    /* sIDs in the range SID_FirstNote through
  76.                  * SID_LastNote (sign bit = 0) are notes. The
  77.                  * sID is the MIDI tone number (pitch). */
  78. #define SID_Rest        128    /* a rest; same data format as a note. */
  79.  
  80. #define SID_Instrument  129    /* set instrument number for this track. */
  81. #define SID_TimeSig     130    /* set time signature for this track. */
  82. #define SID_KeySig    131    /* set key signature for this track. */
  83. #define SID_Dynamic    132    /* set volume for this track. */
  84. #define SID_MIDI_Chnl    133    /* set MIDI channel number (sequencers) */
  85. #define SID_MIDI_Preset    134    /* set MIDI preset number (sequencers) */
  86. #define SID_Clef        135     /* inline clef change. 
  87.                                  * 0=Treble, 1=Bass, 2=Alto, 3=Tenor. */
  88. #define SID_Tempo       136     /* Inline tempo change in beats per minute.*/
  89.  
  90. /* SID values 144 through 159: reserved for Instant Music SEvents. */
  91.  
  92. /* The remaining sID values up through 254: reserved for future
  93.  * standardization. */
  94. #define SID_Mark        255    /* SID reserved for an end-mark in RAM. */
  95.  
  96. /* ---------- SEvent FirstNote..LastNote or Rest -----------------------*/
  97. typedef struct {
  98.     unsigned tone     :8,    /* MIDI tone number 0 to 127; 128 = rest */
  99.              chord    :1,    /* 1 = a chorded note */
  100.              tieOut   :1,    /* 1 = tied to the next note or chord */
  101.              nTuplet  :2,    /* 0 = none, 1 = triplet, 2 = quintuplet,
  102.                  * 3 = septuplet */
  103.              dot      :1,    /* dotted note; multiply duration by 3/2 */
  104.              division :3;    /* basic note duration is 2**-division:
  105.                  * 0 = whole note, 1 = half note, 2 = quarter
  106.                  * note, ... 7 = 128th note */
  107.     } SNote;
  108.  
  109. /* Warning: An SNote is supposed to be a 16-bit entity.
  110.  * Some C compilers will not pack bit fields into anything smaller
  111.  * than an int. So avoid the actual use of this type unless you are certain
  112.  * that the compiler packs it into a 16-bit word.
  113.  */
  114.  
  115. /* You may get better object code by masking, ORing, and shifting using the
  116.  * following definitions rather than the bit-packed fields, above. */
  117. #define noteChord  (1<<7)    /* note is chorded to next note */
  118.  
  119. #define noteTieOut (1<<6)    /* note/chord is tied to next note/chord */
  120.  
  121. #define noteNShift 4            /* shift count for nTuplet field */
  122. #define noteN3     (1<<noteNShift)    /* note is a triplet */
  123. #define noteN5     (2<<noteNShift)    /* note is a quintuplet */
  124. #define noteN7     (3<<noteNShift)    /* note is a septuplet */
  125. #define noteNMask  noteN7        /* bit mask for the nTuplet field */
  126.  
  127. #define noteDot    (1<<3)        /* note is dotted */
  128.  
  129. #define noteDShift 0            /* shift count for division field */
  130. #define noteD1     (0<<noteDShift)    /* whole note division */
  131. #define noteD2     (1<<noteDShift)    /* half note division */
  132. #define noteD4     (2<<noteDShift)    /* quarter note division */
  133. #define noteD8     (3<<noteDShift)     /* eighth note division */
  134. #define noteD16    (4<<noteDShift)     /* sixteenth note division */
  135. #define noteD32    (5<<noteDShift)     /* thirty-secondth note division */
  136. #define noteD64    (6<<noteDShift)     /* sixty-fourth note division */
  137. #define noteD128   (7<<noteDShift)     /* 1/128 note division */
  138. #define noteDMask  noteD128        /* bit mask for the division field */
  139.  
  140. #define noteDurMask 0x3F        /* bit mask for all duration fields
  141.                      * division, nTuplet, dot */
  142.  
  143. /* Field access: */
  144. #define IsChord(snote)    (((UWORD)snote) & noteChord)
  145. #define IsTied(snote)     (((UWORD)snote) & noteTieOut)
  146. #define NTuplet(snote)     ((((UWORD)snote) & noteNMask) >> noteNShift)
  147. #define IsDot(snote)     (((UWORD)snote) & noteDot)
  148. #define Division(snote) ((((UWORD)snote) & noteDMask) >> noteDShift)
  149.  
  150. /* ---------- TimeSig SEvent -------------------------------------------*/
  151. typedef struct {
  152.     unsigned type     :8,    /* = SID_TimeSig */
  153.              timeNSig :5,    /* time signature "numerator" timeNSig + 1 */
  154.              timeDSig :3;    /* time signature "denominator" is
  155.                  * 2**timeDSig: 0 = whole note, 1 = half
  156.                  * note, 2 = quarter note, ...
  157.                  * 7 = 128th note */
  158.     } STimeSig;
  159.  
  160. #define timeNMask  0xF8        /* bit mask for timeNSig field */
  161. #define timeNShift 3        /* shift count for timeNSig field */
  162.  
  163. #define timeDMask  0x07        /*  bit mask for timeDSig field */
  164.  
  165. /* Field access: */
  166. #define TimeNSig(sTime)  ((((UWORD)sTime) & timeNMask) >> timeNShift)
  167. #define TimeDSig(sTime)   (((UWORD)sTime) & timeDMask)
  168.  
  169. /* ---------- KeySig SEvent --------------------------------------------*/
  170. /* "data" value 0 = Cmaj; 1 through 7 = G,D,A,E,B,F#,C#;
  171.  * 8 through 14 = F,Bb,Eb,Ab,Db,Gb,Cb.                    */
  172.  
  173. /* ---------- Dynamic SEvent -------------------------------------------*/
  174. /* "data" value is a MIDI key velocity 0..127. */
  175.  
  176.  
  177. /* ---------- SMUS Writer Support Routines -----------------------------*/
  178.  
  179. /* Just call this to write a SHDR chunk. */
  180. #define PutSHDR(iff, ssHdr)  \
  181.     PutCk(iff, ID_SHDR, sizeof(SScoreHeader), (BYTE *)ssHdr)
  182.  
  183. #endif
  184.